﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace App_Persistencia
{
    public class Evento_Data
    {
        int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        float montoTotal;

        public float MontoTotal
        {
            get { return montoTotal; }
            set { montoTotal = value; }
        }

        int cantPersonas;

        public int CantPersonas
        {
            get { return cantPersonas; }
            set { cantPersonas = value; }
        }

        DateTime fechaEvento;

        public DateTime FechaEvento
        {
            get { return fechaEvento; }
            set { fechaEvento = value; }
        }

        string horaInicio;

        public string HoraInicio
        {
            get { return horaInicio; }
            set { horaInicio = value; }
        }
        string horaFin;

        public string HoraFin
        {
            get { return horaFin; }
            set { horaFin = value; }
        }

        string comentario;

        public string Comentario
        {
            get { return comentario; }
            set { comentario = value; }
        }

        EventoTipo_Data tipoEvento;

        public EventoTipo_Data TipoEvento
        {
            get { return tipoEvento; }
            set { tipoEvento = value; }
        }

        Evento_Estado_Data eveEstado;

        public Evento_Estado_Data EveEstado
        {
            get { return eveEstado; }
            set { eveEstado = value; }
        }

        Cliente_Data cliente;

        public Cliente_Data Cliente
        {
            get { return cliente; }
            set { cliente = value; }
        }

        Salon_Data salon;

        public Salon_Data Salon
        {
            get { return salon; }
            set { salon = value; }
        }

        private string imgDistribucionMesa;

        public string ImgDistribucionMesa
        {
            get { return imgDistribucionMesa; }
            set { imgDistribucionMesa = value; }
        }



        List<Bebida_Data> bebida = new List<Bebida_Data>();

        public List<Bebida_Data> Bebida
        {
            get { return bebida; }
            set { bebida = value; }
        }

        List<Servicio_Adicional_Data> servicioAdicional = new List<Servicio_Adicional_Data>();

        public List<Servicio_Adicional_Data> ServicioAdicional
        {
            get { return servicioAdicional; }
            set { servicioAdicional = value; }
        }

        List<Evento_Detalle_Data> eventoDetalle = new List<Evento_Detalle_Data>();

        public List<Evento_Detalle_Data> EventoDetalle
        {
            get { return eventoDetalle; }
            set { eventoDetalle = value; }
        }

        List<Cobro_Data> cobros = new List<Cobro_Data>();

        public List<Cobro_Data> Cobros
        {
            get { return cobros; }
            set { cobros = value; }
        }

        List<Cronograma_Data> actividades;

        public List<Cronograma_Data> Actividades
        {
            get { return actividades; }
            set { actividades = value; }
        }

        List<Empleado_Data> empleados;

        public DataTable popularEventos()//No Realizados
        {

            string commandSQL = "SELECT     Evento.eve_Id as Nro, Evento.eve_FechaEvento as Fecha, Cliente.cli_Apellido as Apellido, Cliente.cli_Nombre as Nombre, Evento.eve_MontoTotal as MontoTotal "
                               + "FROM Evento, Cliente "
                               + "WHERE Evento.cliente_Id = Cliente.cli_Id and Evento.estadoEvento_Id = " + 1;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            //// Obtengo la tabla del DataSet
            //DataTable dataTable = new DataTable();


            //// Relleno el DataTable
            //dataAdapter.Fill(dataTable);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Evento");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Evento"];

            return dataTable;
        }

        public DataTable misCobros()//No Realizados
        {

            string commandSQL = "SELECT     Cobro.cob_Fecha as Fecha,  Cobro.Cob_Monto as Monto "
                               + "FROM Cobro "
                               + "WHERE Cobro.evento_Id = " + id;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            //// Obtengo la tabla del DataSet
            //DataTable dataTable = new DataTable();


            //// Relleno el DataTable
            //dataAdapter.Fill(dataTable);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Evento");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Evento"];

            return dataTable;
        }


        public void guardarEvento(out int idEvento)
        {

            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarEvento";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                param = command.Parameters.AddWithValue("@fechaEvento", FechaEvento);
                param.DbType = DbType.DateTime;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@estado_Id", eveEstado.Numero);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@observacion", comentario);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@cantPersonas", CantPersonas);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDNI
                param = command.Parameters.AddWithValue("@tipoEventoId", TipoEvento.Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@horaInicio", HoraInicio);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@horaFin", HoraFin);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@DistribucionMesa", ImgDistribucionMesa);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                


                if (Salon.Id != 0)
                {
                    // Establesco el parametro @SocTelefono
                    param = command.Parameters.AddWithValue("@salonId", Salon.Id);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;
                }
                else
                {
                    param = command.Parameters.AddWithValue("@salonId", -1);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;
                }

                // Establesco el parametro @SocDirNumero
                param = command.Parameters.AddWithValue("@clienteId", Cliente.ClienteId);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@eveTotal", montoTotal);
                param.DbType = DbType.Double;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDirDepto
                param = command.Parameters.AddWithValue("@eveId", Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Output;


                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                id = Convert.ToInt32(command.Parameters["@eveId"].Value);
                idEvento = id;

                cargarDetalleBebida(transaccion, connection);
                cargarDetalleServicioAdicional(transaccion, connection);
                cargarDetalleEvento(transaccion, connection);

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }

        }

        public void cargarDetalleBebida(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < Bebida.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarEventoxBebida";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@EventoId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@BebidaId", Bebida[i].Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }

        public void cargarDetalleServicioAdicional(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < ServicioAdicional.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarEventoxServicio";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@EventoId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@ServAdicId", ServicioAdicional[i].Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }

        public void cargarDetalleEvento(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < eventoDetalle.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarDetalleEvento";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@EventoId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@MenuId", eventoDetalle[i].Menu.Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                paramDetalle = commandDetalle.Parameters.AddWithValue("@Cantidad", eventoDetalle[i].Cantidad);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@Precio", eventoDetalle[i].Precio);
                paramDetalle.DbType = DbType.Double;
                paramDetalle.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }

        public void guardarCobro()//MAL
        {


            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarCobro";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                for (int i = 0; i < Cobros.Count; i++)
                {


                    // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                    param = command.Parameters.AddWithValue("@Monto", Cobros[i].Monto);
                    param.DbType = DbType.Double;
                    param.Direction = ParameterDirection.Input;

                    // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                    param = command.Parameters.AddWithValue("@Fecha", Cobros[i].Fecha);
                    param.DbType = DbType.Date;
                    param.Direction = ParameterDirection.Input;

                    param = command.Parameters.AddWithValue("@EventoId", id);
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;


                    // Ejecuto el procedimiento
                    command.ExecuteNonQuery();

                }

                //Si no se genero ningun error en la carga ejecuto el commit

            }
            catch (SystemException e)
            {
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }

        }

        public void cambiarEstado()
        {
            int estadonum = eveEstado.Numero;
            string g = "spUpdateEstadoEvento";

            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {

                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spUpdateEstadoEvento";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                param = command.Parameters.AddWithValue("@EventoId", Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@EstadoId", EveEstado.Numero);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }


        }

        public DataTable buscarEventosCliente()
        {

            string commandSQL = "SELECT   Evento_Tipo.tEve_Nombre AS TipoEve, Evento_Estado.estEve_Nombre AS EstadoEve, Cliente.cli_Nombre AS Nombre, Cliente.cli_Apellido AS Apellido, Evento.eve_Id AS IdEve, "
                + "  Evento.eve_FechaEvento AS Fecha, Evento.eve_MontoTotal AS MontoTotal, Evento.eve_HoraInicio AS HoraInicio, Salon.sal_Nombre AS NomSalon, Evento.eve_HoraFin AS HoraFin,  "
                + "  Evento.eve_DistribucionMesas AS Distribucion, Evento.eve_CantPersonas AS CantPersonas "
                + "  FROM      Evento_Tipo INNER JOIN "
                + "  Evento ON Evento_Tipo.tEve_Id = Evento.tipoEvento_Id INNER JOIN "
                + "  Evento_Estado ON Evento.estadoEvento_Id = Evento_Estado.estEve_Id INNER JOIN "
                + "  Cliente ON Evento.cliente_Id = Cliente.cli_Id INNER JOIN "
                + "  Salon ON Evento.salon_Id = Salon.sal_Id "
                + "  WHERE   (Cliente.cli_Id = " + cliente.ClienteId + " )";



            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));


            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Evento");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Evento"];

            return dataTable;
        }

        public void borrarEmpleadosxEvento()
        {

            string commandSQL = "DELETE FROM Empleados_x_Evento "+
                                "WHERE        (evento_Id = "+this.Id+")";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Evento");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Evento"];

            //return dataTable;
        }

        public void guardarEmpleados(List<Empleado_Data> empleados)
        {
            borrarEmpleadosxEvento();
            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarEmpleadosxEvento";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramEmpleado;

                for (int i = 0; i < empleados.Count; i++)
                {
                    command.Parameters.Clear();

                    paramEmpleado = command.Parameters.AddWithValue("@EventoId", Id);
                    paramEmpleado.DbType = DbType.Int32;
                    paramEmpleado.Direction = ParameterDirection.Input;

                    // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                    paramEmpleado = command.Parameters.AddWithValue("@EmpleadoId", empleados[i].EmpleadoId);
                    paramEmpleado.DbType = DbType.Int32;
                    paramEmpleado.Direction = ParameterDirection.Input;

                    // Ejecuto el procedimiento
                    command.ExecuteNonQuery();

                }



                //Si no se genero ningun error en la carga ejecuto el commit

            }
            catch (SystemException e)
            {
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }



        }

        public int cantidadInvitados()
        {

            int cantidad = 0;
            //Crear el Objeto de conexion, inicializa con la cadena de conexion            
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            try
            {
                connection.Open();

                SqlCommand cmd = new SqlCommand("SELECT        COUNT(*) AS Cantidad " +
                                                "FROM          Invitado " +
                                                "WHERE         (evento_Id = " + id + " ) ", connection);

                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    // el dr.GetString(0) si sabemos el orden de las columnas, es muy rapido, pero medio complicado de leer o saber bien
                    cantidad = int.Parse(dr["Cantidad"].ToString());

                }

            }
            catch (Exception e)
            {

            }

            finally
            {
                // Cierro la conexion
                connection.Close();

            }

            return cantidad;


        }


        public void guardarActividades()
        {

            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarCronograma";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                for (int i = 0; i < actividades.Count; i++)
                {
                    command.Parameters.Clear();

                    if (actividades[i].Actividad.Id == -1)
                    {
                        string nombre = actividades[i].Actividad.Nombre;
                        int idAct = this.cargarActividadCliente(transaccion, connection, nombre);

                        param = command.Parameters.AddWithValue("@actId", idAct);
                        param.DbType = DbType.Int32;
                        param.Direction = ParameterDirection.Input;

                    }
                    else
                    {
                        param = command.Parameters.AddWithValue("@actId", actividades[i].Actividad.Id);
                        param.DbType = DbType.Int32;
                        param.Direction = ParameterDirection.Input;
                    }

                    param = command.Parameters.AddWithValue("@eventoId", Id);// "8/20/2009 12:53:55 AM"
                    param.DbType = DbType.Int32;
                    param.Direction = ParameterDirection.Input;

                    param = command.Parameters.AddWithValue("@fechaYHora", actividades[i].FechayHora);//1
                    param.DbType = DbType.DateTime;
                    param.Direction = ParameterDirection.Input;

                    param = command.Parameters.AddWithValue("@observacion", actividades[i].Observacion);
                    param.DbType = DbType.String;
                    param.Direction = ParameterDirection.Input;

                    // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase





                    // Ejecuto el procedimiento
                    command.ExecuteNonQuery();

                }

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }


        }

        public int cargarActividadCliente(SqlTransaction pTransaccion, SqlConnection pConnection, string nombre)
        {
            int actId = 0;
            // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
            System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
            //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
            commandDetalle.Transaction = pTransaccion;
            //Asingo la conexion al objeto conection
            commandDetalle.Connection = pConnection;
            commandDetalle.CommandText = "spCargarActividadCliente";
            commandDetalle.CommandType = CommandType.StoredProcedure;

            // Declaro el Objeto de parametro
            System.Data.SqlClient.SqlParameter paramDetalle;

            // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
            paramDetalle = commandDetalle.Parameters.AddWithValue("@Nombre", nombre);
            paramDetalle.DbType = DbType.String;
            paramDetalle.Direction = ParameterDirection.Input;

            paramDetalle = commandDetalle.Parameters.AddWithValue("@esDelCliente", "true");
            paramDetalle.DbType = DbType.String;
            paramDetalle.Direction = ParameterDirection.Input;

            paramDetalle = commandDetalle.Parameters.AddWithValue("@actId", Id);
            paramDetalle.DbType = DbType.Int32;
            paramDetalle.Direction = ParameterDirection.Output;




            // Ejecuto el procedimiento
            commandDetalle.ExecuteNonQuery();

            actId = Convert.ToInt32(commandDetalle.Parameters["@actId"].Value);



            return actId;
        }

        public DataTable buscarEvento()
        {

            string commandSQL = "SELECT   Evento_Tipo.tEve_Nombre AS TipoEve, Evento_Estado.estEve_Nombre AS EstadoEve, Cliente.cli_Nombre AS Nombre, Cliente.cli_Apellido AS Apellido, Evento.eve_Id AS IdEve,  "
              + "  Evento.eve_FechaEvento AS Fecha, Evento.eve_MontoTotal AS MontoTotal, Evento.eve_HoraInicio AS HoraInicio, Salon.sal_Nombre AS NomSalon, Evento.eve_HoraFin AS HoraFin,  "
             + "   Evento.eve_DistribucionMesas AS Distribucion, Evento.eve_CantPersonas AS CantPersonas "
             + "   FROM      Evento_Tipo INNER JOIN "
            + "    Evento ON Evento_Tipo.tEve_Id = Evento.tipoEvento_Id INNER JOIN "
            + "    Evento_Estado ON Evento.estadoEvento_Id = Evento_Estado.estEve_Id INNER JOIN "
            + "    Cliente ON Evento.cliente_Id = Cliente.cli_Id INNER JOIN "
            + "    Salon ON Evento.salon_Id = Salon.sal_Id "
             + "   WHERE   (Evento.eve_Id = " + Id + " )";



            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));


            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Evento");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Evento"];

            return dataTable;
        }

        //MAURY: CREO QUE NO SE USA MAS
        public Boolean consultarLlegados()
        {


            Boolean llegaron = false;
            //Crear el Objeto de conexion, inicializa con la cadena de conexion            
            float porcentaje = 0;
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            try
            {
                connection.Open();
                //HACER CONSULTA BIEN
                SqlCommand cmd = new SqlCommand("SELECT        COUNT(*) AS Cantidad " +
                                                "FROM          Invitado " +
                                                "WHERE         (Invitado.inv_estado = 'Ingreso' AND evento_Id = " + id + " ) ", connection);

                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    // el dr.GetString(0) si sabemos el orden de las columnas, es muy rapido, pero medio complicado de leer o saber bien
                    porcentaje = float.Parse(dr["llegados"].ToString());

                }


            }
            catch (Exception e)
            {

            }

            finally
            {
                // Cierro la conexion
                connection.Close();

            }

            if (porcentaje > 80)
            {
                llegaron = true;
            }
            return llegaron;


        }

        /// <summary>
        /// Creo el metodo Mauri
        /// </summary>
        /// <returns></returns>
        public float consultarPorcentajeInvitadosLlegados()
        {
            int cantLlegados = -1;
            //Crear el Objeto de conexion, inicializa con la cadena de conexion            
            float porcentaje = 0;
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            try
            {
                connection.Open();
                //HACER CONSULTA BIEN
                string consulta = "SELECT COUNT(*) AS Cantidad "
                                 + " FROM Invitado "
                                 + " WHERE(evento_Id = " + Id + " ) AND (estadoInvitado_Id = 1)";//1= ingreso
                SqlCommand cmd = new SqlCommand(consulta, connection);

                SqlDataReader dr = cmd.ExecuteReader();


                while (dr.Read())
                {
                    // el dr.GetString(0) si sabemos el orden de las columnas, es muy rapido, pero medio complicado de leer o saber bien
                    cantLlegados = int.Parse(dr["Cantidad"].ToString());
                }


            }
            catch (Exception e)
            {

            }

            finally
            {
                // Cierro la conexion
                connection.Close();

            }

            porcentaje = (cantLlegados * 100) / CantPersonas;

            return porcentaje;

        }

        public DataTable traerEventosNoFinalizados()
        {

            string commandSQL = "SELECT        Evento.eve_Id, Evento.eve_FechaEvento AS Fecha, Evento.eve_HoraInicio AS horaIni, Evento.eve_HoraFin AS horaFin, Evento_Tipo.tEve_Nombre AS tipo, "
                         + "Cliente.cli_Nombre AS cli_nombre, Cliente.cli_Apellido AS cli_apellido "
+ "FROM            Evento INNER JOIN "
                         + "Cliente ON Evento.cliente_Id = Cliente.cli_Id INNER JOIN "
                         + "Evento_Tipo ON Evento.tipoEvento_Id = Evento_Tipo.tEve_Id "
+ "WHERE        (Evento.estadoEvento_Id = 1) OR "
                         + "(Evento.estadoEvento_Id = 2)";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            //// Obtengo la tabla del DataSet
            //DataTable dataTable = new DataTable();


            //// Relleno el DataTable
            //dataAdapter.Fill(dataTable);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Reunion");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Reunion"];

            return dataTable;
        }

    }
}
